package grafica;

import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.ImageIcon;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JTextArea;
import javax.swing.WindowConstants;
import logica.ControlJuego;
import logica.Orientacion;
import grafica.coleccionables.ColeccionableEntity;
import grafica.obstaculos.ObstaculoEntity;
import grafica.pintadas.PintadaEntity;
import grafica.pisos.PisoEntity;
import grafica.premios.PremioEntity;
import grafica.robots.BalaEntity;
import grafica.robots.RobotEntity;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.image.BufferStrategy;
import java.io.IOException;
import java.util.ArrayList;

/**
* This code was edited or generated using CloudGarden's Jigloo
* SWT/Swing GUI Builder, which is free for non-commercial
* use. If Jigloo is being used commercially (ie, by a corporation,
* company or business for any purpose whatever) then you
* should purchase a license for each developer using Jigloo.
* Please visit www.cloudgarden.com for details.
* Use of Jigloo implies acceptance of these licensing terms.
* A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR
* THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED
* LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE.
*/
/**
 * Esta clase maneja la interfaz grafica del juego y ademas se comunica con ControlJuego 
 * quien maneja la logica interna del juego. 
 * 
 * La clase consiste en un loop infinito que observa todas las entidades en el juego 
 * pidiendoles que se muestren en la pantalla o que se muevan.
 * 
 * Esta clase se baso parcialmente en el tutorial de Kevin Glass 
 * "Space Invaders 101, An Accelerated Java 2D Tutorial"
 * 
 * Código parcialmente generado con CloudGarden's Jigloo
 * SWT/Swing GUI Builder.
 * 
 * @author Amorosi, Javier (94528)
 * @author Antiman, Nehuen (102440)
 */
public class ControlGraficos  {
	
	private String windowTitle = "Linguo 2 - The Empire Strikes Back on the Lost Ark of the Temple of Doom, in a New Hope";
	protected JFrame frame;
	protected JPanel panel;
	
	private JScrollPane jScrollPaneTexto;
	private JTextArea codigo;
	private int linea;
	
	private JTextArea statusBar;
	
	private JPanel jPanelBotones;
	private JButton botonSoltar;	
	private JButton botonGirarDerecha;
	private JButton botonDisparar;
	private JButton botonGirarIzquierda;
	private JButton botonRecoger;
	private JButton botonAvanzar;

	private JMenuBar jMenuBar;
	private JMenu menuArchivo;
	private JMenu menuAcciones;
	private JMenu menuVista;
	private JMenu menuAyuda;
	private JMenu menuCambio;
	
	private JMenuItem itemMilitar;
	private JMenuItem itemCivil;		
	private JMenuItem itemNosotros;	
	private JMenuItem itemAyuda;
	private JMenuItem itemRecoger;
	private JMenuItem itemPintar;
	private JMenuItem itemDisparar;	
	private JMenuItem itemIzquierda;
	private JMenuItem itemDerecha;
	private JMenuItem itemAvanzar;
	private JMenuItem itemSalir;
	private JMenuItem itemAbrir;
	private JMenuItem itemNoGrilla;
	private JMenuItem itemGrilla;
	private JMenuItem itemNoPintar;
	private JMenuItem itemReiniciar;
	private JMenuItem itemSoltar;
	
	private JSeparator jSeparator1;
	private JSeparator jSeparator2;
	private JSeparator jSeparator3;
	private JSeparator jSeparator4;
	private JSeparator jSeparator5;
	private JSeparator jSeparator6;
	
	protected Canvas canvas;
	private int pixelesImagenes=50; //50x50.
	private BufferStrategy strategy;
	private double moveSpeed = 250;
	private long lastFpsTime;
	private int fps;
	
	private int tipoRobot=0; //Civil por defecto;
	
	private Lector lector;
	
	private ControlJuego control;
	RobotEntity robotG;
	
	private String nivel;
	
	private boolean ocupado=false;
	private boolean gameRunning = true;
	private boolean pintar=false;
	private boolean eligioColor=false;
	private boolean grilla=false;
	
	private Color colorPintadas=Color.BLACK;
	
	private ArrayList<PintadaEntity> pintadas = new ArrayList<PintadaEntity>();
	private ArrayList<PisoEntity> pisos = new ArrayList<PisoEntity>();
	private ArrayList<PremioEntity> premios = new ArrayList<PremioEntity>();
	private ArrayList<ColeccionableEntity> coleccionables = new ArrayList<ColeccionableEntity>();
	private ArrayList<ObstaculoEntity> obstaculos = new ArrayList<ObstaculoEntity>();
	private ArrayList<BalaEntity> balas = new ArrayList<BalaEntity>();
	
	/**
	 * Constructor de la clase ControlGraficos, inicializa todas las entidades del juego
	 * junto con su representación gráfica. 
	 */
	public ControlGraficos() {
		
		//Set Look & Feel
		try {
			javax.swing.UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
		} catch(Exception e) {
			e.printStackTrace();
		}
		
		frame = new JFrame(windowTitle);
    	panel = (JPanel) frame.getContentPane();
    	
    	frame.setSize(1024, 650);
    	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	frame.setLocationRelativeTo(null);
    	
    	initGUI();
        
     	frame.pack();
     	frame.setResizable(false);
     	frame.setVisible(true);

     	frame.addWindowListener(new WindowAdapter() {
     		public void windowClosing(WindowEvent e) {
     			System.exit(0);
     		}
     	});		     
     	
		//Cuestiones de Canvas
		canvas.setIgnoreRepaint(true);
		KeyInputHandler input=new KeyInputHandler();
		canvas.addKeyListener(input);
		canvas.requestFocus();
		canvas.createBufferStrategy(2);
		strategy = canvas.getBufferStrategy();
		
		iniciarJuego();
	}
	
	/**
	 * Agrega un piso gráfico a las entidades del juego. 
	 * @param p piso a agregar. 
	 */
	public void add(PisoEntity p){
		pisos.add(p);
	}
	
	/**
	 * Agrega un premio gráfico a las entidades del juego. 
	 * @param p premio a agregar. 
	 */
	public void add(PremioEntity p){
		premios.add(p);
	}
	
	/**
	 * Agrega un coleccionable gráfico a las entidades del juego. 
	 * @param p coleccionable a agregar. 
	 */
	public void add(ColeccionableEntity p){
		coleccionables.add(p);
	}
	
	/**
	 * Agrega un obstáculo gráfico a las entidades del juego. 
	 * @param p obstáculo a agregar. 
	 */
	public void add(ObstaculoEntity p){
		obstaculos.add(p);
	}
	
	/**
	 * Agrega una bala gráfica a las entidades del juego. 
	 * @param p piso a agregar. 
	 */
	public void add(BalaEntity p){
		balas.add(p);
	}
	
	/**
	 * Remueve un piso gráfico de las entidades del juego. 
	 * @param p piso a remover. 
	 */
	public void remove(PisoEntity p){
		pisos.remove(p);
	}
	
	/**
	 * Remueve un premio gráfico de las entidades del juego. 
	 * @param p premio a remover. 
	 */
	public void remove(PremioEntity p){
		premios.remove(p);
	}
	
	/**
	 * Remueve un coleccionable gráfico de las entidades del juego. 
	 * @param p coleccionable a remover. 
	 */
	public void remove(ColeccionableEntity p){
		coleccionables.remove(p);
	}
	
	/**
	 * Remueve un obstáculo gráfico de las entidades del juego. 
	 * @param p obstáculo a remover. 
	 */
	public void remove(ObstaculoEntity p){
		obstaculos.remove(p);
	}
	
	/**
	 * Remueve una bala gráfica de las entidades del juego. 
	 * @param p bala a remover. 
	 */
	public void remove(BalaEntity p){
		balas.remove(p);
	}
	
	/**
	 * Retorna el lado en pixeles de las imágenes del juego, son siempre cuadradas.
	 * @return lado en pixeles de las imágenes del juego, son siempre cuadradas.
	 */
	public int getPixelesImagenes(){
		return pixelesImagenes; 
	}
	
	/**
	 * Instacia al robot gráfico.
	 * @param r Robot gráfico.
	 */
	public void setRobotG(RobotEntity r){
		robotG=r;
	}
	
	/**
	 * Con este método se le notifica a la gráfica de haber ganado.
	 */
	public void exito() {
		ImageIcon icon=new ImageIcon(getClass().getClassLoader().getResource("datos/default/icons/ganar.png"));
		JOptionPane.showMessageDialog(frame,
			    "Bien! Haz llegado a la meta",
			    "Victoria!",
			    JOptionPane.INFORMATION_MESSAGE,
			    icon);
		iniciarJuego();
	}
	
	/**
	 * Con este método se le notifica a la gráfica de haber perdido.
	 */
	public void fracaso() {
		ImageIcon icon=new ImageIcon(getClass().getClassLoader().getResource("datos/default/icons/perder.png"));
		JOptionPane.showMessageDialog(frame,
			    "Se ha agotado el combustible",
			    "Derrota!",
			    JOptionPane.INFORMATION_MESSAGE,
			    icon);
		iniciarJuego();
	}
	
	/**
	 * Este loop cicla durante todo el juego. Sus reponsabilidades son:
	 * - Actualizar movimientos de las entidades.
	 * - Dibujar el contenido a mostrar por pantalla.
	 */
	public void gameLoop() {
		long lastLoopTime = System.currentTimeMillis();
		
		while (gameRunning) {
			long delta = System.currentTimeMillis() - lastLoopTime;
			lastLoopTime = System.currentTimeMillis();
			
			lastFpsTime += delta;
			fps++;
								
			if (lastFpsTime >= 1000) {
				frame.setTitle(windowTitle+" (FPS: "+fps+")");
				lastFpsTime = 0;
				fps = 0;
			}	
			
			// Get hold of a graphics context for the accelerated 
			// surface and blank it out
			Graphics2D g = (Graphics2D) strategy.getDrawGraphics();
			g.setColor(Color.BLACK);
			g.fillRect(0,0,800,600);
			
			for (int i=0;i<pisos.size();i++) 
				pisos.get(i).draw(g);		
			for (int i=0;i<pintadas.size();i++) 
				pintadas.get(i).draw(g);
			for (int i=0;i<premios.size();i++) 
				premios.get(i).draw(g);
			for (int i=0;i<coleccionables.size();i++) 
				coleccionables.get(i).draw(g);
			for (int i=0;i<obstaculos.size();i++) 			
				obstaculos.get(i).draw(g);
			
			for (int i=0;i<balas.size();i++) 
				balas.get(i).move(delta);
			for (int i=0;i<balas.size();i++) 
				balas.get(i).draw(g);
			
			if (grilla) {
				int x = 0;
				int y = 0;
				int pix=getPixelesImagenes();
				for (int i = 0; i < 12; i++) {
					for (int j = 0; j < 16; j++) {
						g.drawRect(x, y, pix, pix);
						x += pix;
					}
					y += pix;
					x = 0;
				}
			}
			
			int mov=getPixelesImagenes()/2;
			
			if (robotG.moviendo()) 
                robotG.move(mov);
			
			if (!robotG.girando())
                robotG.draw(g);
			else{
				robotG.rotate(g, moveSpeed, control.getOrientacionRobot());
			}
			
			//El robot choco algun premio?
			for (int p=0;p<premios.size();p++) 		
				if (robotG.collidesWith(premios.get(p))) 
					premios.get(p).collidedWith(robotG);
			
			//Alguna bala impacto contra algún obstaculo?
			for (int p=0;p<balas.size();p++) 
				for (int s=0;s<obstaculos.size();s++) 
					if(balas.size()>0){
						Entity me = balas.get(p);
						Entity him = obstaculos.get(s);					
						if (me.collidesWith(him)) {
							me.collidedWith(him);
							him.collidedWith(me);
						}
					}
			
			// Al terminar de dibujar. 
			g.dispose();
			strategy.show();
			
			ocupado= robotG.girando() || robotG.moviendo();
			
			// Pausa el juego por un momento.
			try { Thread.sleep(5); } catch (Exception e) {}			
		}
	}
	
	private void avanzar(){
		if (!ocupado) {
			ocupado=true;
			if (pintar)
				pintar();
			if (control.avanzarRobot()) 
				robotG.avanzar(moveSpeed);			
			actualizarCodigo("avanzar(1)");
			actualizarStatusBar(); 
		}
	}
	
	private void pintar(){
		pintadas.add(new PintadaEntity(this, robotG.getF(), robotG.getC(), colorPintadas));	
	}
	
	private void girarIzquierda(){
		if (!ocupado) {
			ocupado=true;
			if (control.girarRobot(Orientacion.IZQUIERDA)) 
				robotG.girarRobot(Orientacion.IZQUIERDA);	
			actualizarCodigo("izquierda()");
			actualizarStatusBar();
		}
	}
	
	private void girarDerecha(){
		if (!ocupado) {
			ocupado=true;
			if (control.girarRobot(Orientacion.DERECHA)) 
				robotG.girarRobot(Orientacion.DERECHA);	
			actualizarCodigo("derecha()");
			actualizarStatusBar();
		}
	}
	
	private void disparar(){
		if (!ocupado){
			if(control.accionEspecial()){
				robotG.accionEspecial();
				actualizarCodigo("disparar()");
				actualizarStatusBar();
			}
		}
	}
	
	private void recoger(){
		if (!ocupado){
			if(control.recogerColeccionable()){
				int fTrasera=fTrasera();
				int cTrasera=cTrasera();
				int i=0;
				boolean listo=false;
				while (i<coleccionables.size() && !listo)
					if (coleccionables.get(i).getF()==fTrasera && coleccionables.get(i).getC()==cTrasera){
						robotG.guardarBaul(coleccionables.get(i));
						coleccionables.remove(i);
						listo=true;
					} else
						i++;
				actualizarCodigo("recogerColeccionable()");
				actualizarStatusBar();
			}
		}
	}
	
	private int fTrasera(){
		int f=robotG.getF();
		int o=robotG.getOrientacionLogica();
		if (o==Orientacion.ARRIBA)
			f++;
		else if (o==Orientacion.ABAJO)
			f--;
		return f;
	}
	
	private int cTrasera(){
		int c=robotG.getC();
		int o=robotG.getOrientacionLogica();
		if (o==Orientacion.IZQUIERDA)
			c++;
		else if (o==Orientacion.DERECHA)
			c--;
		return c;
	}
	
	private void soltar(){
		if (!ocupado){
			if(control.soltarColeccionable()){
				ColeccionableEntity coleccionable=robotG.quitarBaul();
				coleccionable.setF(fTrasera());
				coleccionable.setC(cTrasera());
				coleccionables.add(coleccionable);
				actualizarCodigo("soltarColeccionable()");
				actualizarStatusBar();
			}
		}
	}
	
	private void cambiarRobot(){
		if (tipoRobot==0){
			tipoRobot=1;
			iniciarJuego();
			botonDisparar.setEnabled(true);
			itemDisparar.setEnabled(true);
			itemMilitar.setEnabled(false);
			itemCivil.setEnabled(true);
		} else {
			tipoRobot=0;
			iniciarJuego();
			botonDisparar.setEnabled(false);
			itemDisparar.setEnabled(false);
			itemMilitar.setEnabled(true);
			itemCivil.setEnabled(false);
		}
	}
	
	private void toggleGrilla(){		
		grilla=!grilla;
		itemGrilla.setEnabled(!grilla);
		itemNoGrilla.setEnabled(grilla);
	}
	
	private void actualizarCodigo(String accion){
		String s=new String(codigo.getText()+"\n"+linea+": "+accion);
		codigo=new JTextArea(s);
		codigo.setEditable(false);
		jScrollPaneTexto.setViewportView(codigo);
		linea++;
	}
	
	private void actualizarStatusBar(){
		statusBar.setText(control.toString());
	}
	
	private void iniciarJuego() {	
		pintar=false;
		eligioColor=false;
		pisos.clear();
		premios.clear();
		coleccionables.clear();
		obstaculos.clear();
		pintadas.clear();
		linea=0;
     	control=new ControlJuego(this);
		//control.seleccionarRobot(tipoRobot);
		if (nivel!=null)
			control.iniciarNivel(nivel, tipoRobot);	
		else
			control.iniciarNivel(null, tipoRobot);	
		codigo.setText("Código:");
		actualizarStatusBar();
	}		
	
	
	
	private void initGUI() {
		try {
			
			frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
			panel.setLayout(null);
			panel.setBackground(new java.awt.Color(0,0,0));
			{
				jScrollPaneTexto = new JScrollPane();
				panel.add(jScrollPaneTexto);
				jScrollPaneTexto.setBounds(0, 120, 224, 530);
				{
					codigo = new JTextArea();
					jScrollPaneTexto.setViewportView(codigo);
					codigo.setPreferredSize(new java.awt.Dimension(224, 530));
					codigo.setText("Código:");
				}
			}
			{
				jPanelBotones = new JPanel();
				GridLayout jPanelBotonesLayout = new GridLayout(2, 3);
				jPanelBotonesLayout.setHgap(1);
				jPanelBotonesLayout.setVgap(1);
				jPanelBotonesLayout.setColumns(3);
				jPanelBotonesLayout.setRows(2);
				panel.add(jPanelBotones);
				jPanelBotones.setBounds(0, 0, 224, 120);
				jPanelBotones.setLayout(jPanelBotonesLayout);
				{	
					botonSoltar = new JButton();
					jPanelBotones.add(botonSoltar);
					botonSoltar.setIcon(new ImageIcon(getClass().getClassLoader().getResource("datos/default/icons/soltar.png")));
					botonSoltar.addActionListener(new ActionListener() {
						public void actionPerformed(ActionEvent evt) {
							botonSoltarActionPerformed(evt);
						}
					});
				}
				{
					botonAvanzar = new JButton();
					jPanelBotones.add(botonAvanzar);
					botonAvanzar.setIcon(new ImageIcon(getClass().getClassLoader().getResource("datos/default/icons/avanzar.png")));
					botonAvanzar.addActionListener(new ActionListener() {
						public void actionPerformed(ActionEvent evt) {
							botonAvanzarActionPerformed(evt);
						}
					});
				}
				{
					botonRecoger = new JButton();
					jPanelBotones.add(botonRecoger);
					botonRecoger.setIcon(new ImageIcon(getClass().getClassLoader().getResource("datos/default/icons/recoger.png")));
					botonRecoger.addActionListener(new ActionListener() {
						public void actionPerformed(ActionEvent evt) {
							botonRecogerActionPerformed(evt);
						}
					});
				}
				{
					botonGirarIzquierda = new JButton();
					jPanelBotones.add(botonGirarIzquierda);
					botonGirarIzquierda.setIcon(new ImageIcon(getClass().getClassLoader().getResource("datos/default/icons/izquierda.png")));
					botonGirarIzquierda.addActionListener(new ActionListener() {
						public void actionPerformed(ActionEvent evt) {
							botonGirarIzquierdaActionPerformed(evt);
						}
					});
				}
				{
					botonDisparar = new JButton();
					jPanelBotones.add(botonDisparar);
					botonDisparar.setEnabled(false);
					botonDisparar.setIcon(new ImageIcon(getClass().getClassLoader().getResource("datos/default/icons/disparar.png")));
					botonDisparar.addActionListener(new ActionListener() {
						public void actionPerformed(ActionEvent evt) {
							botonDispararActionPerformed(evt);
						}
					});
				}
				{
					botonGirarDerecha = new JButton();
					jPanelBotones.add(botonGirarDerecha);
					botonGirarDerecha.setIcon(new ImageIcon(getClass().getClassLoader().getResource("datos/default/icons/derecha.png")));
					botonGirarDerecha.addActionListener(new ActionListener() {
						public void actionPerformed(ActionEvent evt) {
							botonGirarDerechaActionPerformed(evt);
						}
					});
				}
			}
			{
	     		jMenuBar = new JMenuBar();
	     		frame.setJMenuBar(jMenuBar);
	     		jMenuBar.setSize(1024, 25);
	     		{
	     			menuArchivo = new JMenu();
	     			jMenuBar.add(menuArchivo);
	     			menuArchivo.setText("Archivo");
	     			menuArchivo.setMnemonic(java.awt.event.KeyEvent.VK_F);
	     			{
	     				itemAbrir = new JMenuItem();
	     				menuArchivo.add(itemAbrir);
	     				itemAbrir.setText("Cargar Nivel");
	     				itemAbrir.setIcon(new ImageIcon(getClass().getClassLoader().getResource("datos/default/icons/abrir.png")));
	     				itemAbrir.addActionListener(new ActionListener() {
	     					public void actionPerformed(ActionEvent evt) {
	     						itemAbrirActionPerformed(evt);
	     					}
	     				});
	     			}
	     			{
	     				itemSalir = new JMenuItem();
	     				menuArchivo.add(itemSalir);
	     				itemSalir.setText("Salir");
	     				itemSalir.setIcon(new ImageIcon(getClass().getClassLoader().getResource("datos/default/icons/salir.png")));
	     				itemSalir.addActionListener(new ActionListener() {
	     					public void actionPerformed(ActionEvent evt) {
	     						itemSalirActionPerformed(evt);
	     					}
	     				});
	     			}
	     		}
	     		{
	     			menuAcciones = new JMenu();
	     			jMenuBar.add(menuAcciones);
	     			menuAcciones.setText("Acciones");
	     			{
	     				itemAvanzar = new JMenuItem();
	     				menuAcciones.add(itemAvanzar);
	     				itemAvanzar.setText("Avanzar");
	     				itemAvanzar.setIcon(new ImageIcon(getClass().getClassLoader().getResource("datos/default/icons/avanzar.png")));
	     				itemAvanzar.addActionListener(new ActionListener() {
	     					public void actionPerformed(ActionEvent evt) {
	     						itemAvanzarActionPerformed(evt);
	     					}
	     				});
	     			}
	     			{
	     				itemDerecha = new JMenuItem();
	     				menuAcciones.add(itemDerecha);
	     				itemDerecha.setText("Girar a la Derecha");
	     				itemDerecha.setIcon(new ImageIcon(getClass().getClassLoader().getResource("datos/default/icons/derecha.png")));
	     				itemDerecha.addActionListener(new ActionListener() {
	     					public void actionPerformed(ActionEvent evt) {
	     						itemDerechaActionPerformed(evt);
	     					}
	     				});
	     			}
	     			{
	     				itemIzquierda = new JMenuItem();
	     				menuAcciones.add(itemIzquierda);
	     				itemIzquierda.setText("Girar a la Izquierda");
	     				itemIzquierda.setIcon(new ImageIcon(getClass().getClassLoader().getResource("datos/default/icons/izquierda.png")));
	     				itemIzquierda.addActionListener(new ActionListener() {
	     					public void actionPerformed(ActionEvent evt) {
	     						itemIzquierdaActionPerformed(evt);
	     					}
	     				});
	     			}
	     			{
	     				jSeparator1 = new JSeparator();
	     				menuAcciones.add(jSeparator1);
	     			}
	     			{
	     				itemDisparar = new JMenuItem();
	     				itemDisparar.setEnabled(false);
	     				menuAcciones.add(itemDisparar);
	     				itemDisparar.setText("Disparar");
	     				itemDisparar.setIcon(new ImageIcon(getClass().getClassLoader().getResource("datos/default/icons/disparar.png")));
	     				itemDisparar.addActionListener(new ActionListener() {
	     					public void actionPerformed(ActionEvent evt) {
	     						itemDispararActionPerformed(evt);
	     					}
	     				});
	     			}
	     			{
	     				jSeparator2 = new JSeparator();
	     				menuAcciones.add(jSeparator2);
	     			}
	     			{
	     				itemPintar = new JMenuItem();
	     				menuAcciones.add(itemPintar);
	     				itemPintar.setText("Activar Pincel");
	     				itemPintar.setIcon(new ImageIcon(getClass().getClassLoader().getResource("datos/default/icons/pintar.png")));	     				
	     				itemPintar.addActionListener(new ActionListener() {
	     					public void actionPerformed(ActionEvent evt) {
	     						itemPintarActionPerformed(evt);
	     					}
	     				});
	     			}
	     			{
	     				itemNoPintar = new JMenuItem();
	     				menuAcciones.add(itemNoPintar);
	     				itemNoPintar.setText("Desactivar Pincel");	
	     				itemNoPintar.setEnabled(false);
	     				itemNoPintar.setIcon(new ImageIcon(getClass().getClassLoader().getResource("datos/default/icons/noPintar.png")));
	     				itemNoPintar.addActionListener(new ActionListener() {
	     					public void actionPerformed(ActionEvent evt) {
	     						itemNoPintarActionPerformed(evt);
	     					}
	     				});
	     			}		     			
	     			{
	     				jSeparator3 = new JSeparator();
	     				menuAcciones.add(jSeparator3);
	     			}
	     			{
	     				itemRecoger = new JMenuItem();
	     				menuAcciones.add(itemRecoger);
	     				itemRecoger.setText("Recoger Coleccionable");
	     				itemRecoger.setIcon(new ImageIcon(getClass().getClassLoader().getResource("datos/default/icons/recoger.png")));
	     				itemRecoger.addActionListener(new ActionListener() {
	     					public void actionPerformed(ActionEvent evt) {
	     						itemRecogerActionPerformed(evt);
	     					}
	     				});
	     			}
	     			{
	     				itemSoltar = new JMenuItem();
	     				menuAcciones.add(itemSoltar);
	     				itemSoltar.setText("Soltar Coleccionable");
	     				itemSoltar.setIcon(new ImageIcon(getClass().getClassLoader().getResource("datos/default/icons/soltar.png")));
	     				itemSoltar.addActionListener(new ActionListener() {
	     					public void actionPerformed(ActionEvent evt) {
	     						itemSoltarActionPerformed(evt);
	     					}
	     				});
	     			}
	     			{
	     				jSeparator5 = new JSeparator();
	     				menuAcciones.add(jSeparator5);
	     			}
	     			{
	     				menuCambio = new JMenu();
	     				menuAcciones.add(menuCambio);
	     				menuCambio.setText("Seleccionar Robot");
	     				{
	     					itemCivil = new JMenuItem();
	     					itemCivil.setEnabled(false);
	     					menuCambio.add(itemCivil);
	     					itemCivil.setText("Robot Civil");
	     					itemCivil.setIcon(new ImageIcon(getClass().getClassLoader().getResource("datos/default/RobotCivil.png")));
	     					itemCivil.addActionListener(new ActionListener() {
	     						public void actionPerformed(ActionEvent evt) {
	     							itemCivilActionPerformed(evt);
	     						}
	     					});
	     				}
	     				{
	     					itemMilitar = new JMenuItem();
	     					menuCambio.add(itemMilitar);
	     					itemMilitar.setText("Robot Militar");
	     					itemMilitar.setIcon(new ImageIcon(getClass().getClassLoader().getResource("datos/default/RobotMilitar.png")));
	     					itemMilitar.addActionListener(new ActionListener() {
	     						public void actionPerformed(ActionEvent evt) {
	     							itemMilitarActionPerformed(evt);
	     						}
	     					});
	     				}
	     			}
	     			{
	     				jSeparator6 = new JSeparator();
	     				menuAcciones.add(jSeparator6);
	     			}
	     			{
	     				itemReiniciar = new JMenuItem();
	     				menuAcciones.add(itemReiniciar);
	     				itemReiniciar.setText("Reiniciar");
	     				itemReiniciar.setIcon(new ImageIcon(getClass().getClassLoader().getResource("datos/default/icons/reiniciar.png")));
	     				itemReiniciar.addActionListener(new ActionListener() {
	     					public void actionPerformed(ActionEvent evt) {
	     						itemReiniciarActionPerformed(evt);
	     					}
	     				});

	     			}
	     		}
	     		{
	     			menuVista = new JMenu();
	     			jMenuBar.add(menuVista);
	     			menuVista.setText("Vista");	     			
	     			{
	     				itemGrilla = new JMenuItem();
	     				menuVista.add(itemGrilla);
	     				itemGrilla.setText("Mostrar grilla");
	     				itemGrilla.setIcon(new ImageIcon(getClass().getClassLoader().getResource("datos/default/icons/grilla.png")));
	     				itemGrilla.addActionListener(new ActionListener() {
	     					public void actionPerformed(ActionEvent evt) {
	     						itemGrillaActionPerformed(evt);
	     					}
	     				});
	     			}
	     			{
	     				itemNoGrilla = new JMenuItem();
	     				menuVista.add(itemNoGrilla);
	     				itemNoGrilla.setEnabled(false);
	     				itemNoGrilla.setText("Ocultar Grilla");
	     				itemNoGrilla.setIcon(new ImageIcon(getClass().getClassLoader().getResource("datos/default/icons/noGrilla.png")));
	     				itemNoGrilla.addActionListener(new ActionListener() {
	     					public void actionPerformed(ActionEvent evt) {
	     						itemNoGrillaActionPerformed(evt);
	     					}
	     				});
	     			}
	     		}
	     		{
	     			menuAyuda = new JMenu();
	     			jMenuBar.add(menuAyuda);
	     			menuAyuda.setText("Ayuda");
	     			{
	     				itemAyuda = new JMenuItem();
	     				menuAyuda.add(itemAyuda);
	     				itemAyuda.setText("Cómo Jugar");
	     				itemAyuda.setIcon(new ImageIcon(getClass().getClassLoader().getResource("datos/default/icons/ayuda.png")));
	     				itemAyuda.addActionListener(new ActionListener() {
	     					public void actionPerformed(ActionEvent evt) {
	     						itemAyudaActionPerformed(evt);
	     					}
	     				});
	     			}
	     			{
	     				jSeparator4 = new JSeparator();
	     				menuAyuda.add(jSeparator4);
	     			}
	     			{
	     				itemNosotros = new JMenuItem();
	     				menuAyuda.add(itemNosotros);
	     				itemNosotros.setText("Sobre Nosotros");
	     				itemNosotros.setIcon(new ImageIcon(getClass().getClassLoader().getResource("datos/default/icons/nosotros.png")));
	     				itemNosotros.addActionListener(new ActionListener() {
	     					public void actionPerformed(ActionEvent evt) {
	     						itemNosotrosActionPerformed(evt);
	     					}
	     				});
	     			}
	     		}
	     	}
	     	{
	    		canvas = new Canvas();
	    		canvas.setVisible(true);
	    		panel.add(canvas);
	    		canvas.setBounds(224, 0, 800, 600);
	    		canvas.setForeground(new java.awt.Color(255,255,255));
	    	}
	     	{	    
	     		JPanel statusPanel=new JPanel();
	     		panel.add(statusPanel);	     		
	     		statusPanel.setBounds(224, 600, 800, 50);
	     		statusBar=new JTextArea();
	     		statusPanel.add(statusBar);
	     		statusBar.setFont(new java.awt.Font("Dialog",0,14));
	     	}
	     	
	     	panel.setPreferredSize(new Dimension(1024, 650));
	     	panel.setSize(1024, 650);
		} catch (Exception e) {
		    //add your error handling code here
			e.printStackTrace();
		}
	}
	
	
	
	private void botonSoltarActionPerformed(ActionEvent evt) {
		soltar();
	}
	
	private void botonAvanzarActionPerformed(ActionEvent evt) {
		avanzar();
	}
	
	private void botonRecogerActionPerformed(ActionEvent evt) {
		recoger();
	}
	
	private void botonGirarIzquierdaActionPerformed(ActionEvent evt) {
		girarIzquierda();
	}
	
	private void botonDispararActionPerformed(ActionEvent evt) {
		disparar();
	}
	
	private void botonGirarDerechaActionPerformed(ActionEvent evt) {
		girarDerecha();		
	}

	private void itemAbrirActionPerformed(ActionEvent evt) {
		String porFallo=nivel;
		try {
			lector=new Lector();
			nivel=new String(lector.generarCadena());
		} catch (IOException e) {
			nivel=porFallo; 
		}
		iniciarJuego(); 
	}
	
	private void itemSalirActionPerformed(ActionEvent evt) {
		System.exit(0);
	}
	
	private void itemAvanzarActionPerformed(ActionEvent evt) {
		avanzar();
	}
	
	private void itemDerechaActionPerformed(ActionEvent evt) {
		girarDerecha();
	}
	
	private void itemIzquierdaActionPerformed(ActionEvent evt) {
		girarIzquierda();
	}
	
	private void itemDispararActionPerformed(ActionEvent evt) {
		disparar();
	}
	
	private void itemPintarActionPerformed(ActionEvent evt) {
		if (!eligioColor){//Solo se puede elegir la primera vez que se intenta pintar. 
			colorPintadas = JColorChooser.showDialog(
					frame,
					"Seleccione el color de la pintura",
					colorPintadas);
			eligioColor=true;
		}
		pintar=true;
		itemPintar.setEnabled(false);
		itemNoPintar.setEnabled(true);
		actualizarCodigo("activarPincel()");
	}
	
	private void itemNoPintarActionPerformed(ActionEvent evt) {
		pintar=false; 
		itemPintar.setEnabled(true);
		itemNoPintar.setEnabled(false);
		actualizarCodigo("desactivarPincel()");
	}
	
	private void itemRecogerActionPerformed(ActionEvent evt) {
		recoger();
	}
	
	private void itemSoltarActionPerformed(ActionEvent evt) {
		soltar();
	}
	
	private void itemCivilActionPerformed(ActionEvent evt) {
		cambiarRobot();
	}
	
	private void itemMilitarActionPerformed(ActionEvent evt) {
		cambiarRobot();
	}
	
	private void itemReiniciarActionPerformed(ActionEvent evt) {
		iniciarJuego();
	}
	
	private void itemAyudaActionPerformed(ActionEvent evt) {
		JOptionPane.showMessageDialog(frame,
			    "Controles: \n" +
			    "(hacer click sobre el panel del juego previamente) \n" +
			    "Q : soltar coleccionable.\n" +
			    "W : avanzar.\n" +
			    "E : recolectar coleccionable.\n" +
			    "A : girar a la izquierda.\n" +
			    "S : diparar (solo robot militar).\n" +
			    "D : girar a la derecha.\n" +
			    "R : reiniciar juego.\n" +
			    "T : cambiar tipo de robot.\n" +
			    "G : activar/desactivar grilla.\n" +
			    "Alt+F : moverse por menues.\n\n" +
			    "Para más información consultar el manual de usuario.\n" 
			    , "Nosotros",
			    JOptionPane.PLAIN_MESSAGE);
	}
	
	private void itemNosotrosActionPerformed(ActionEvent evt) {
		JOptionPane.showMessageDialog(frame,
			    "ProyectoX para la Cátedra Tecnología de Programación 2013\n" +
			    "Amorosi Javier - Antiman Nehuen",
			    "Nosotros",
			    JOptionPane.PLAIN_MESSAGE);
	}
	
	private void itemGrillaActionPerformed(ActionEvent evt) {
		toggleGrilla();
	}
	
	private void itemNoGrillaActionPerformed(ActionEvent evt) {
		toggleGrilla();
	}	

	/**
	 * Clase interna que maneja la entrada por teclado.
	 */
	private class KeyInputHandler extends KeyAdapter {
		public void keyTyped(KeyEvent e) {			
			
			switch (e.getKeyChar()){			
			case 27:// Escape, se sale del juego. 
				System.exit(0);
				break;
			case 'q':
				soltar();
				break;
			case 'w':
				avanzar();
				break;
			case 'e':
				recoger();
				break;
			case 'a':
				girarIzquierda();
				break;
			case 's':
				disparar();
				break;	
			case 'd':
				girarDerecha();
				break;	
			case 'r'://Reiniciar.
				iniciarJuego();
				break;
			case 't':
				cambiarRobot();
				break;	
			case 'g':
				toggleGrilla();
				break;				
			}
			
		}
	}

}
